﻿using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;

using Wicresoft.Shell.Core;
using Wicresoft.Shell.Data;
using Wicresoft.Shell.Logic;

namespace Wicresoft.Shell.Package.AppExp
{
    /// <summary>
    /// This class implements the tool window exposed by this package and hosts a user control.
    ///
    /// In Visual Studio tool windows are composed of a frame (implemented by the shell) and a pane, 
    /// usually implemented by the package implementer.
    ///
    /// This class derives from the ToolWindowPane class provided from the MPF in order to use its 
    /// implementation of the IVsWindowPane interface.
    /// </summary>
    [Guid("f94c2a66-c676-4863-9aea-59912e678a64")]
    public class MyToolWindow : ToolWindowPane
    {
        // This is the user control hosted by the tool window; it is exposed to the base class 
        // using the Window property. Note that, even if this class implements IDispose, we are
        // not calling Dispose on this object. This is because ToolWindowPane calls Dispose on 
        // the object returned by the Window property.
        private MyControl control;
        //private ExistConnectForm m_ExistCnnsForm;

        public MenuCommand propertyCommand;
        /// <summary>
        /// Standard constructor for the tool window.
        /// </summary>
        public MyToolWindow() :
            base(null)
        {
            // Set the window title reading it from the resources.
            this.Caption = Resources.ToolWindowTitle;
            // Set the image that will appear on the tab of the window frame
            // when docked with an other window
            // The resource ID correspond to the one defined in the resx file
            // while the Index is the offset in the bitmap strip. Each image in
            // the strip being 16x16.
            this.BitmapResourceID = 301;
            this.BitmapIndex = 0;

            control = new MyControl(this);
            //m_ExistCnnsForm = new ExistConnectForm();

            this.ToolBar = new CommandID(GuidList.guidAppExpCmdSet, PkgCmdIDList.cmdidAppExpToolBarMenu);
            OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
            if (null != mcs)
            {
                CommandID refreshButton = new CommandID(GuidList.guidAppExpCmdSet, PkgCmdIDList.cmdidAppExpButtonRefresh);
                MenuCommand refreshCommand = new MenuCommand(new EventHandler(RefreshButton_Click), refreshButton);
                mcs.AddCommand(refreshCommand);

                CommandID cancelRefreshButton = new CommandID(GuidList.guidAppExpCmdSet, PkgCmdIDList.cmdidAppExpButtonCancelRefresh);
                MenuCommand cancelRefreshCommand = new MenuCommand(new EventHandler(CancelRefreshButton_Click), cancelRefreshButton);
                mcs.AddCommand(cancelRefreshCommand);

                CommandID propertyButton = new CommandID(GuidList.guidAppExpCmdSet, PkgCmdIDList.cmdidAppExpButtonProperty);
                propertyCommand = new MenuCommand(new EventHandler(PropertyButton_Click), propertyButton);
                mcs.AddCommand(propertyCommand);
                propertyCommand.Enabled = false;

                CommandID selectdbButton = new CommandID(GuidList.guidAppExpCmdSet, PkgCmdIDList.cmdidAppExpButtonSelectDB);
                MenuCommand selectdbCommand = new MenuCommand(new EventHandler(SelectDBButton_Click), selectdbButton);
                mcs.AddCommand(selectdbCommand);
            }
        }

        private void RefreshButton_Click(object sender, EventArgs e)
        {
            RefreshWorkspaceData();
        }

        private void CancelRefreshButton_Click(object sender, EventArgs e)
        {
            control.DisconnectWorkspace();
        }

        private void PropertyButton_Click(object sender, EventArgs e)
        {
            (this.Package as AppExpPackage).ShowConfigurationToolWindow(null, null);
        }

        private void SelectDBButton_Click(object sender, EventArgs e)
        {
            if (Workspace.Connect())
                RefreshWorkspaceData();
        }

        /// <summary>
        /// This property returns the handle to the user control that should
        /// be hosted in the Tool Window.
        /// </summary>
        override public IWin32Window Window
        {
            get
            {
                return (IWin32Window)control;
            }
        }


        public object GetvsService(Type service)
        {
            return GetService(service);
        }

        public void RefreshWorkspaceData()
        {
            if (control != null)
                control.RefreshData();
        }
    }
}
